package com.ctg.platform.core.security;

import java.util.List;
import java.util.Map;

import com.ctg.payroll2.bean.filter.sysadmin.RoleFilter;
import com.ctg.platform.core.security.Exception.RoleNameException;
import com.ctg.platform.core.security.Exception.SecurityException;
import com.ctg.platform.core.security.entity.Account;
import com.ctg.platform.core.security.entity.Resource;
import com.ctg.platform.core.security.entity.Role;
import com.ctg.platform.core.security.entity.SysLogUser;
import com.ctg.platform.util.Page;
/**
 * 权限框架接口
 * @author luli
 * @createdate 2009-8-6 上午11:37:31
 */
public interface SpringSecurityManager {
	/**
	 * 翻页查询
	 * @param startrow 起始行
	 * @param endrow 结束行
	 * @return Page对象
	 */
	Page getRoleList(int startrow, int endrow);
	Page getRoleListByFilter(RoleFilter filter);
	/**
	 * 读取系统资源和角色的对应关系
	 * @param productType 产品类型
	 * @return 存放资源和角色对应关系的map
	 */
	Map < String, String > loadUrlAuthorities(String productType);
	/**
	 * 获取系统中所有产品的类型
	 * @return 系统中所有产品类型的清单
	 */
	List < String > loadProductTypeList();
	/**
	 * 新增账户(密码为空时设置密码为000000)
	 * @param account 账户对象
	 * @param sysLogUser 操作对象
	 * @return	新增用户的数量
	 */
	int createSysAccount(Account account, SysLogUser sysLogUser) throws SecurityException;
	/**
	 * 新增账户(密码为空时设置密码为000000)
	 * @param account 账户对象
	 * @param sysLogUser 操作对象
	 * @return	新增用户的对象
	 */
	Account createSysAccountAndGet(Account account, SysLogUser sysLogUser) throws SecurityException;
	/**
	 * 新增角色
	 * @param role 角色对象(角色名需要以ROLE_开头,系统自动添加)
	 * @param sysLogUser 操作对象
	 * @return 新增角色的id
	 */
	String createSysRole(Role role, SysLogUser sysLogUser) throws SecurityException, RoleNameException;
	/**
	 * 新增资源
	 * @param res 资源对象
	 * @param sysLogUser 操作对象
	 * @return 新增资源的id
	 */
	String createSysResource(Resource res, SysLogUser sysLogUser);
	/**
	 * 对账户新增角色
	 * @param account 账户对象
	 * @param roleIds 角色id数组
	 * @param sysLogUser 操作对象
	 * @return 新增是否成功
	 */
	boolean assignRoleForAccount(Account account, String[] roleIds, SysLogUser sysLogUser);
	/**
	 * 对账户收回角色
	 * @param accountId 账户id
	 * @param roleIds 角色id数组
	 * @param sysLogUser 操作对象
	 * @return 收回角色是否成功
	 */
	boolean revokeRoleFromAccount(String accountId, String[] roleIds, SysLogUser sysLogUser);
	/**
	 * 对账户收回所有角色
	 * @param accountId 账户id
	 * @param sysLogUser 操作对象
	 * @return 收回角色是否成功
	 */
	boolean revokeRoleFromAccount(String accountId, SysLogUser sysLogUser);
	/**
	 * 对角色分配权限
	 * @param roleId 角色id
	 * @param privileges 权限id
	 * @param sysLogUser 操作对象
	 * @return 分配是否成功
	 */
	boolean assignPrivilegeForRole(String roleId, String[] privileges, SysLogUser sysLogUser);
	/**
	 * 对角色分配权限(分配前会删除之前已经分配的权限)
	 * @param roleId 角色id
	 * @param privileges 权限id
	 * @param sysLogUser 操作对象
	 * @return 分配是否成功
	 */
	boolean assignPrivilegeForRole2(String roleId, String[] privileges, SysLogUser sysLogUser);
	/**
	 * 对角色收回权限
	 * @param roleId 角色id
	 * @param privileges 权限id数组
	 * @param sysLogUser 操作对象
	 * @return 收回权限是否成功
	 */
	boolean revokePrivilegeFromRole(String roleId, String[] privileges, SysLogUser sysLogUser);
	/**
	 * 对角色收回所有权限
	 * @param roleId 角色id
	 * @param sysLogUser 操作对象
	 * @return 收回权限是否成功
	 */
	boolean revokeAllPrivilegeFromRole(String roleId, SysLogUser sysLogUser);
	/**
	 * 根据账户id返回该账户所有权限资源
	 * @param account 账户对象
	 * @param sysLogUser 操作对象
	 * @return 权限清单
	 */
	List < Resource > getPrivilegesByAccountId(String accountId, SysLogUser sysLogUser);
	/**
	 * 根据登录名返回该账户所有权限资源
	 * @param logName 登录名
	 * @param sysLogUser 操作对象
	 * @return 权限清单
	 */
	List < Resource > getPrivilegesByLoginName(String logName, SysLogUser sysLogUser);
	/**
	 * 根据角色id返回该账户所拥有的权限资源(如果角色或者资源被冻结,就不会查出来)
	 * @param roleId 角色id
	 * @param sysLogUser 操作对象
	 * @return 权限清单
	 */
	List < Resource > getPrivilegesByRoleId(String roleId, SysLogUser sysLogUser);
	/**
	 * 根据角色id返回该账户所有的权限资源(冻结的也会查出来)
	 * @param roleId 角色id
	 * @param sysLogUser 操作对象
	 * @return 权限清单
	 */
	List < Resource > getAllPrivilegesByRoleId(String roleId, SysLogUser sysLogUser);
	/**
	 * 根据账户id返回账户信息
	 * @param accountId 账户id
	 * @param sysLogUser 操作对象
	 * @return 账户对象
	 */
	Account getAccountByAccountId(String accountId, SysLogUser sysLogUser);
	/**
	 * 根据账户名返回账户信息
	 * @param accountId 账户id
	 * @param sysLogUser 操作对象
	 * @return 账户对象
	 */
	Account getAccountByUserName(String userName, SysLogUser sysLogUser);
	/**
	 * 根据角色id返回角色信息
	 * @param roleId 角色id
	 * @param sysLogUser 操作对象
	 * @return 角色对象
	 */
	Role getRoleByRoleId(String roleId, SysLogUser sysLogUser);
	/**
	 * 删除账户信息，且删除关系表中数据
	 * @param accountId 账户id数组
	 * @param sysLogUser 操作对象
	 * @return 删除是否成功
	 */
	boolean deleteAccountById(String[] accountId, SysLogUser sysLogUser);
	/**
	 * 根据账户id冻结账户
	 * @param accountId 账户id数组
	 * @param sysLogUser 操作对象
	 * @return 冻结是否成功
	 */
	boolean freezeAccount(String[] accountId, SysLogUser sysLogUser);
	/**
	 * 根据账户id对账户解冻
	 * @param accountId 账户id数组
	 * @param sysLogUser 操作对象
	 * @return 解冻是否成功
	 */
	boolean unfreezeAccount(String[] accountId, SysLogUser sysLogUser);
	/**
	 * 删除角色信息，且删除关系表中数据
	 * @param roleId 角色id数组
	 * @param sysLogUser 操作对象
	 * @return 删除是否成功
	 */
	boolean deleteRoleById(String[] roleId, SysLogUser sysLogUser);
	/**
	 * 根据角色id对角色冻结
	 * @param roleId 角色id数组
	 * @param sysLogUser 操作对象
	 * @return 冻结是否成功
	 */
	boolean freezeRole(String[] roleId, SysLogUser sysLogUser);
	/**
	 * 根据角色id对角色解冻
	 * @param roleId 角色id数组
	 * @param sysLogUser 操作对象
	 * @return 解冻是否成功
	 */
	boolean unfreezeRole(String[] roleId, SysLogUser sysLogUser);
	/**
	 * 资源根据资源id删除资源
	 * @param privilegeId 资源id数组
	 * @param sysLogUser 操作对象
	 * @return
	 */
	boolean deletePrivilegesById(String[] privilegeId, SysLogUser sysLogUser);
	/**
	 * 冻结资源
	 * @param privilegeId 资源id数组
	 * @param sysLogUser 操作对象
	 * @return
	 */
	boolean freezePrivileges(String[] privilegeId, SysLogUser sysLogUser);
	/**
	 * 根据角色id对资源解冻
	 * @param roleId 角色id数组
	 * @param sysLogUser 操作对象
	 * @return 解冻资源是否成功
	 */
	boolean unfreezePrivileges(String[] privilegeId, SysLogUser sysLogUser);
	/**
	 * 用户修改密码功能，修改前需要验证原密码。
	 * @param userName 需要修改密码的登录名
	 * @param oldPassword 原密码
	 * @param newPassword 新密码
	 * @param sysLogUser 操作对象
	 * @return 密码修改是否成功
	 */
	boolean changePasswordByUsername(String userName, String oldPassword,
			String newPassword, SysLogUser sysLogUser);
	/**
	 * 用户修改密码功能，修改前需要验证原密码。
	 * @param userName 需要修改密码的登录名
	 * @param userId 登录id
	 * @param oldPassword 原密码
	 * @param newPassword 新密码
	 * @param sysLogUser 操作对象
	 * @return 密码修改是否成功
	 */
	boolean changePasswordByUsernameAndId(String userName, String userId, String oldPassword,
			String newPassword, SysLogUser sysLogUser);
	/**
	 * 根据角色id返回该角色的所有用户清单
	 * @param roleId 角色id 	
	 * @return 该角色的所有用户清单
	 */
	List<Account> getAccountListByRoleId(String roleId);
	/**
	 * 根据资源id更新该资源
	 * @param resource 资源对象
	 * @return 更新是否成功
	 */
	boolean updateResource(Resource resource);
	/**
	 * 
	 * @param role
	 * @return
	 */
	boolean updateRole(Role role) throws RoleNameException;
	/**
	 * 根据查询条件查询用户列表(翻页查询)
	 * @param idList 存放账户id的list
	 * @param userName 用户名
	 * @param isDisabled 是否启用 0:启用,1:冻结
	 * @param startrow 开始行
	 * @param endrow 结束行
	 * @return 用户列表
	 */
	Page getUserListByFilter(List<String> idList, String userName, String isDisabled, int startrow, int endrow);
	/**
	 * 根据查询条件查询用户列表
	 * @param userName	用户名
	 * @param isDisabled 是否启用 0:启用,1:冻结
	 * @return 用户列表
	 */
	List<Account> getUserListByFilter(String userName, String isDisabled);
	/**
	 * 根据资源id获得资源清单
	 * @param ids 资源id数组
	 * @return 资源清单
	 */
	List<Resource> getPrivilegesByPrivilegeIds(String[] ids);
	/**
	 * 根据登录名得到该用户的role列表
	 * @param name 登录名
	 * @return role列表
	 */
	List<Role> getRoleListByLoginName(String name);
	/**
	 * 
	 * @param ids
	 * @return
	 */
	Page getPrivilegesPageByPrivilegeIds(String[] ids);
	/**
	 * 根据角色名取得角色信息
	 * @param roleName 角色名
	 * @param flag 传入的角色名是否需要重新构造成"ROLE_"形式
	 * @return 角色信息
	 */
	Role getRoleByRoleName(String roleName, boolean flag);
}
